guint flippable : 1;
guint inverted : 1;
guint slider_size_fixed : 1;
+ guint slider_use_min_size : 1;
guint trough_click_forward : 1; /* trough click was on the forward side of slider */
/* Stepper sensitivity */
return range->priv->flippable;
}
+void
+gtk_range_set_slider_use_min_size (GtkRange *range,
+ gboolean use_min_size)
+{
+ GtkRangePrivate *priv = range->priv;
+
+ if (use_min_size != priv->slider_use_min_size)
+ {
+ priv->slider_use_min_size = use_min_size;
+ gtk_css_gadget_queue_resize (priv->slider_gadget);
+ }
+}
+
/**
* gtk_range_set_slider_size_fixed:
* @range: a #GtkRange
{
GtkRangePrivate *priv = range->priv;
GtkAllocation trough_content_alloc;
- int slider_width, slider_height;
+ int slider_width, slider_height, min_slider_size;
measure_one_gadget (priv->slider_gadget, &slider_width, &slider_height);
gtk_css_gadget_get_content_box (priv->trough_gadget, &trough_content_alloc);
+ min_slider_size = priv->min_slider_size;
+
if (priv->orientation == GTK_ORIENTATION_VERTICAL)
{
gint y, bottom, top, height;
slider_rect->x = trough_content_alloc.x + (int) floor ((trough_content_alloc.width - slider_width) / 2);
slider_rect->width = slider_width;
+ if (priv->slider_use_min_size)
+ min_slider_size = slider_height;
+
/* Compute slider position/length */
top = trough_content_alloc.y;
bottom = top + trough_content_alloc.height;
/* Scale slider half extends over the trough edge */
if (GTK_IS_SCALE (range))
{
- top -= priv->min_slider_size / 2;
- bottom += priv->min_slider_size / 2;
+ top -= min_slider_size / 2;
+ bottom += min_slider_size / 2;
}
/* slider height is the fraction (page_size /
height = ((bottom - top) * (gtk_adjustment_get_page_size (priv->adjustment) /
(gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment))));
else
- height = priv->min_slider_size;
+ height = min_slider_size;
- if (height < priv->min_slider_size ||
+ if (height < min_slider_size ||
priv->slider_size_fixed)
- height = priv->min_slider_size;
+ height = min_slider_size;
height = MIN (height, trough_content_alloc.height);
slider_rect->y = trough_content_alloc.y + (int) floor ((trough_content_alloc.height - slider_height) / 2);
slider_rect->height = slider_height;
+ if (priv->slider_use_min_size)
+ min_slider_size = slider_width;
+
/* Compute slider position/length */
left = trough_content_alloc.x;
right = left + trough_content_alloc.width;
/* Scale slider half extends over the trough edge */
if (GTK_IS_SCALE (range))
{
- left -= priv->min_slider_size / 2;
- right += priv->min_slider_size / 2;
+ left -= min_slider_size / 2;
+ right += min_slider_size / 2;
}
/* slider width is the fraction (page_size /
width = ((right - left) * (gtk_adjustment_get_page_size (priv->adjustment) /
(gtk_adjustment_get_upper (priv->adjustment) - gtk_adjustment_get_lower (priv->adjustment))));
else
- width = priv->min_slider_size;
+ width = min_slider_size;
- if (width < priv->min_slider_size ||
+ if (width < min_slider_size ||
priv->slider_size_fixed)
- width = priv->min_slider_size;
+ width = min_slider_size;
width = MIN (width, trough_content_alloc.width);
gboolean has_c,
gboolean has_d);
-GtkCssGadget *gtk_range_get_slider_gadget (GtkRange *range);
+void gtk_range_set_slider_use_min_size (GtkRange *range,
+ gboolean use_min_size);
+GtkCssGadget *gtk_range_get_slider_gadget (GtkRange *range);
G_END_DECLS
G_OBJECT_CLASS (gtk_scale_parent_class)->notify (object, pspec);
}
-static void
-gtk_scale_update_style (GtkScale *scale)
-{
- gint slider_length;
- GtkRange *range;
- GtkCssGadget *slider_gadget;
-
- range = GTK_RANGE (scale);
- slider_gadget = gtk_range_get_slider_gadget (range);
- gtk_css_gadget_get_preferred_size (slider_gadget,
- gtk_orientable_get_orientation (GTK_ORIENTABLE (scale)), -1,
- &slider_length, NULL,
- NULL, NULL);
-
- gtk_range_set_min_slider_size (range, slider_length);
- gtk_scale_clear_layout (scale);
-}
-
#define add_slider_binding(binding_set, keyval, mask, scroll) \
gtk_binding_entry_add_signal (binding_set, keyval, mask, \
I_("move-slider"), 1, \
gtk_widget_set_can_focus (GTK_WIDGET (scale), TRUE);
gtk_range_set_slider_size_fixed (range, TRUE);
+ gtk_range_set_slider_use_min_size (range, TRUE);
_gtk_range_set_has_origin (range, TRUE);
gtk_range_set_round_digits (range, priv->digits);
gtk_range_set_flippable (range, TRUE);
-
- gtk_scale_update_style (scale);
}
static void
static void
gtk_scale_style_updated (GtkWidget *widget)
{
- gtk_scale_update_style (GTK_SCALE (widget));
+ gtk_scale_clear_layout (GTK_SCALE (widget));
GTK_WIDGET_CLASS (gtk_scale_parent_class)->style_updated (widget);
}
if (gtk_orientable_get_orientation (GTK_ORIENTABLE (widget)) == GTK_ORIENTATION_HORIZONTAL)
{
gint n1, w1, h1, n2, w2, h2;
+ GtkCssGadget *slider_gadget;
gint slider_length;
gint w;
- slider_length = gtk_range_get_min_slider_size (GTK_RANGE (widget));
+ slider_gadget = gtk_range_get_slider_gadget (GTK_RANGE (widget));
+ gtk_css_gadget_get_preferred_size (slider_gadget,
+ GTK_ORIENTATION_HORIZONTAL, -1,
+ &slider_length, NULL,
+ NULL, NULL);
gtk_scale_get_mark_label_size (GTK_SCALE (widget), GTK_POS_TOP, &n1, &w1, &h1, &n2, &w2, &h2);
if (gtk_orientable_get_orientation (GTK_ORIENTABLE (widget)) == GTK_ORIENTATION_VERTICAL)
{
gint n1, w1, h1, n2, w2, h2;
+ GtkCssGadget *slider_gadget;
gint slider_length;
gint h;
- slider_length = gtk_range_get_min_slider_size (GTK_RANGE (widget));
+ slider_gadget = gtk_range_get_slider_gadget (GTK_RANGE (widget));
+ gtk_css_gadget_get_preferred_size (slider_gadget,
+ GTK_ORIENTATION_VERTICAL, -1,
+ &slider_length, NULL,
+ NULL, NULL);
gtk_scale_get_mark_label_size (GTK_SCALE (widget), GTK_POS_TOP, &n1, &w1, &h1, &n2, &w2, &h2);
h1 = (n1 - 1) * h1 + MAX (h1, slider_length);
static void
gtk_scrollbar_update_style (GtkScrollbar *scrollbar)
{
- gint slider_length;
gboolean fixed_size;
gboolean has_a, has_b, has_c, has_d;
GtkRange *range = GTK_RANGE (scrollbar);
GtkWidget *widget = GTK_WIDGET (scrollbar);
- GtkCssGadget *slider_gadget = gtk_range_get_slider_gadget (range);
-
- gtk_css_gadget_get_preferred_size (slider_gadget,
- gtk_orientable_get_orientation (GTK_ORIENTABLE (scrollbar)), -1,
- &slider_length, NULL,
- NULL, NULL);
gtk_widget_style_get (widget,
"fixed-slider-length", &fixed_size,
"has-forward-stepper", &has_d,
NULL);
- gtk_range_set_min_slider_size (range, slider_length);
gtk_range_set_slider_size_fixed (range, fixed_size);
_gtk_range_set_steppers (range, has_a, has_b, has_c, has_d);
}
gtk_scrollbar_init (GtkScrollbar *scrollbar)
{
gtk_scrollbar_update_style (scrollbar);
+ gtk_range_set_slider_use_min_size (GTK_RANGE (scrollbar), TRUE);
}
static void